/***
 * @Description: 本文件主要定义和IP地址有关的内容，包括数据结构
 * @Author: Liverpool
 * @Date: 2024-04-22 01:47:16
 * @LastEditTime: 2024-04-22 01:47:54
 * @LastEditors: Liverpool
 */

#ifndef IP_ADDRESS_H
#define IP_ADDRESS_H

#include "system.h"
#define IPV4_ADDR_SIZE 4

// 定义IP地址数据结构
typedef struct ip_addr
{
    enum
    {
        IP_ADDR_V4,
    } type;
    union
    {
        uint32_t q_addr;
        uint8_t a_addr[IPV4_ADDR_SIZE];
    };
} D_IP_ADDR;

void ip_addr_set_any(D_IP_ADDR *ip);                                                        // 对IP地址进行初始设置
int ip_addr_is_any(D_IP_ADDR *ip);                                                          // 判断IP地址是否为空
net_err_t ipaddr_from_str(D_IP_ADDR *dest, const char *str);                                // 根据点分十进制转化为ip地址
void ipaddr_copy(D_IP_ADDR *dest, const D_IP_ADDR *src);                                    // 对IP地址进行copy
D_IP_ADDR *ipaddr_get_any(void);                                                            // 获得空IP地址
int ipaddr_is_equal(const D_IP_ADDR *ip1, const D_IP_ADDR *ip2);                            // 用于判断两个IP地址是否相同
void ipaddr_to_buf(const D_IP_ADDR *ip, uint8_t *in_buf);                                   // 把IP地址写入buf中
void ipaddr_from_buf(D_IP_ADDR *ip, uint8_t *buf);                                          // 从字节数组buf中解析IP地址
int ipaddr_is_local_broadcast(const D_IP_ADDR *ipaddr);                                     // 判断当前IP地址是否为本地广播
int ipaddr_is_direct_broadcast(const D_IP_ADDR *ipaddr, const D_IP_ADDR *netmask);          // 判断当前IP地址是否为定向广播
D_IP_ADDR ipaddr_get_host(const D_IP_ADDR *ipaddr, const D_IP_ADDR *netmask);               // 根据IP地址和子网掩码查找处于当前网络下的主机号
D_IP_ADDR ipaddr_get_net(const D_IP_ADDR *ipaddr, const D_IP_ADDR *netmask);                // 根据IP地址和子网掩码来来获取当前网络下的网络号
int ipaddr_is_match(const D_IP_ADDR *dest, const D_IP_ADDR *src, const D_IP_ADDR *netmask); // 判断目的地址和源地址是否匹配
#endif                                                                                      // !IP_ADDRESS_H
